public class Ordercoffee {
    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        Beverage beverage1 = new Mocha(beverage);
        System.out.println(beverage1.getDescription()+ " $" + beverage1.cost());

        Beverage beverage2 = new Soy(beverage1);
        System.out.println(beverage2.getDescription()+ " $" + beverage2.cost());
    }


}
/*
装饰器的特点：
比继承更灵活，也能避免子类不断增加导致类爆炸

装饰器的实现：
1、必须同继承一个类对象，才能互相包装（利用组合和多态的思想，把beverge被包装类传进去）

如上例子，Beverage先定义了getDescription和抽象cost

CondimentDecorator重新把getDescription定义为抽象，就是说包装类必须重定义描述。同一个继承针对同一个方法两个类采用了a和非a的逻辑

Espresso 和 mocha、Soy共属于Beverage

soy(mocha(Espresso))
 */